import collections,random

card = collections.namedtuple('Card',['num','huaSe'])

class Cards:
    
    rank = [str(i) for i in range(2,11)] + list('JQKA')
    suit = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._card = [card(i, j) for i in self.rank
                             for j in self.suit ]
        
    def __getitem__(self, position):
        return self._card[position]
    
    def __len__(self):
        return len(self._card)
    
  
card1 = Cards()

# 按理说，card1 并不是一个序列，就不能使用 len 和 [] 这种写法，但是定义的时候实现了这两个特殊方法，就可以了
print(len(card1))
print(card1[4]) 


#因为实现了__getitem__方法，可以使用切片，可以用 for i in 这种写法

one = random.choice(card1)
print(type(one))
print(one[0],one[1])
print(one.huaSe)
print(one.num)

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)

def spades_high(card):
    rank_value = Cards.rank.index(card.num)
    return rank_value * len(suit_values) + suit_values[card.huaSe]
#此方法给所有卡片上了一个大小，并且不重复，这算法牛逼
#clubs 2 = 0  clubs 3 = 4 
print(spades_high(one)) 

print(repr(one))
print(dir(Cards))